# -*- coding: utf-8 -*-
"""
Created on
@Time: 2024/12/31 8:18
@Author: Mr.Z
@contact: <QQ:40061980>
@contact: bob@pheks.com
@File: main.py
@IDE: PyCharm
@@ Version：
"""
import sys
import webbrowser
from pynput import keyboard

import pyautogui
from PySide6.QtCore import QTimer, QPoint, Qt
from PySide6.QtGui import QIcon, QPixmap, QKeySequence
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QLineEdit, QCheckBox,
                               QPushButton, QHBoxLayout, QButtonGroup, QMessageBox)

from gui.about import AboutWindow


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.count = None  # 连点次数
        self.interval = None  # 两次点击时间间隔
        self.about_window = None  # 关于窗口

        self.setWindowTitle("鼠标连点器 v1.0")  # 设置窗口标题
        self.setWindowIcon(QIcon("./static/image/logo.png"))  # 设置窗口图标
        self.setGeometry(100, 100, 580, 300)  # 设置窗口大小和位置
        self.setMinimumSize(580, 300)  # 设置窗口最小大小
        self.center_on_screen()  # 窗口居中显示

        # 设置字体大小
        self.setStyleSheet("font-size: 16px;")

        # 创建主部件
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)

        # 创建主布局
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        # 创建导航栏
        self.web_button = QPushButton("官方网站")
        self.community_button = QPushButton("社区支持")
        self.upload_button = QPushButton("检查更新")
        self.about_button = QPushButton("关于")

        self.navbar_layout = QHBoxLayout()  # 创建一个QHBoxLayout来布局
        self.navbar_layout.addWidget(self.web_button)  # 添加导航栏按钮
        self.navbar_layout.addWidget(self.community_button)  # 添加导航栏按钮
        self.navbar_layout.addWidget(self.upload_button)  # 添加导航栏按钮
        self.navbar_layout.addWidget(self.about_button)  # 添加导航栏按钮
        self.layout.addLayout(self.navbar_layout)  # 将导航栏布局添加到主布局中

        # 绑定导航栏按钮点击事件
        self.web_button.clicked.connect(lambda: self.open_website("https://www.pheks.com"))  # 绑定官方网站按钮点击事件
        self.community_button.clicked.connect(lambda: self.open_website("https://www.pheks.com"))  # 绑定社区支持按钮点击事件
        self.upload_button.clicked.connect(self.check_updates)
        self.about_button.clicked.connect(self.show_about)

        # 创建其它内容布局
        self.content_layout = QHBoxLayout()  # 创建一个新的水平布局
        self.content_icon_label = QLabel()  # 创建一个QLabel来显示图标
        self.content_icon_label.setPixmap(QPixmap("./static/image/tips.png"))
        self.content_label = QLabel("请先设置时间和次数，点击保存设置后点击按钮或对应的方向键开始！")
        self.content_layout.addWidget(self.content_icon_label)  # 添加图标到布局中
        self.content_layout.addWidget(self.content_label)  # 添加提示信息到布局中
        self.layout.addLayout(self.content_layout)  # 将布局添加到主布局中

        # 第一部分：时间设置
        self.time_icon_label = QLabel()  # 创建一个QLabel来显示图标
        self.time_icon_label.setPixmap(QPixmap("./static/image/clock.png"))  # 设置时间图标路径
        self.time_label = QLabel("鼠标两次点击的间隔时间:")
        self.time_edit = QLineEdit("1000")
        self.time_label2 = QLabel("毫秒（1秒=1000毫秒）")
        self.time_layout = QHBoxLayout()  # 创建一个QHBoxLayout来布局
        self.time_layout.addWidget(self.time_icon_label)  # 添加时间图标
        self.time_layout.addWidget(self.time_label)  # 添加时间标签
        self.time_layout.addWidget(self.time_edit)  # 添加时间输入框
        self.time_layout.addWidget(self.time_label2)  # 添加时间单位标签
        self.layout.addLayout(self.time_layout)  # 添加时间布局

        # 第二部分：次数设置
        self.count_icon_label = QLabel()  # 创建一个QLabel来显示图标
        self.count_icon_label.setPixmap(QPixmap("./static/image/click.png"))  # 设置次数图标路径
        self.count_infinitive_checkbox = QCheckBox("无限制连点")
        self.count_limit_checkbox = QCheckBox("点击")
        self.count_edit = QLineEdit("10")
        self.count_label3 = QLabel("次停止点击")
        self.count_layout = QHBoxLayout()  # 创建一个QHBoxLayout来布局

        # 创建一个QButtonGroup，并将两个QCheckBox添加到其中
        self.checkbox_group = QButtonGroup()
        self.checkbox_group.addButton(self.count_infinitive_checkbox)
        self.checkbox_group.addButton(self.count_limit_checkbox)

        # 当选择其中一个复选框时，自动取消选择另一个复选框
        self.checkbox_group.setExclusive(True)

        self.count_infinitive_checkbox.setChecked(True)  # 默认选择无限连点

        self.count_layout.addWidget(self.count_icon_label)  # 添加次数图标
        self.count_layout.addWidget(self.count_infinitive_checkbox)  # 添加无限连点勾选框
        self.count_layout.addWidget(self.count_limit_checkbox)  # 添加次数限制勾选框
        self.count_layout.addWidget(self.count_edit)  # 添加次数输入框
        self.count_layout.addWidget(self.count_label3)  # 添加次数标签
        self.layout.addLayout(self.count_layout)  # 将次数布局添加到主布局中

        # 第三部分：勾选运行状态或超级模式
        self.run_status_icon_label = QLabel()  # 创建一个QLabel来显示图标
        self.run_status_icon_label.setPixmap(QPixmap("./static/image/setting.png"))  # 设置运行图标路径
        self.run_status_checkbox = QCheckBox("运行状态")
        self.super_mode_checkbox = QCheckBox("超级模式")

        # 创建一个QLabel来显示超级模式提示图标
        self.super_mode_icon_label = QLabel()
        self.super_mode_icon_label.setPixmap(QPixmap("./static/image/help.png"))
        self.super_mode_icon_label.setToolTip("开启超级模式后，连点按钮将无视鼠标位置，直接点击屏幕任意位置！")

        self.checkbox_layout = QHBoxLayout()
        self.checkbox_layout.addWidget(self.run_status_icon_label)

        self.checkbox_layout.addWidget(self.super_mode_checkbox)
        self.checkbox_layout.addWidget(self.super_mode_icon_label)
        self.checkbox_layout.addWidget(self.run_status_checkbox)

        self.layout.addLayout(self.checkbox_layout)  # 将设置布局添加到主布局中

        # 第四部分：按钮
        self.left_click_button = QPushButton("左键连点 (←)")  # 创建左键连点按钮
        self.left_click_button.setStyleSheet("background-color: #1484ec; color: #fff;")  # 设置按钮样式
        self.right_click_button = QPushButton("右键连点 (→)")  # 创建右键连点按钮
        self.right_click_button.setStyleSheet("background-color: #1484ec; color: #fff;")  # 设置按钮样式
        self.stop_button = QPushButton("停止连连 (↓)")  # 创建停止连点按钮
        self.stop_button.setStyleSheet("background-color: #f44336; color: #fff;")  # 设置按钮样式
        self.save_button = QPushButton("保存设置")  # 创建保存设置按钮
        self.save_button.setStyleSheet("background-color: #4caf50; color: #fff;")  # 设置按钮样式

        self.button_layout = QHBoxLayout()  # 创建一个QHBoxLayout作为按钮布局
        self.button_layout.addWidget(self.left_click_button)  # 添加左键连点按钮到按钮布局中
        self.button_layout.addWidget(self.right_click_button)  # 添加右键连点按钮到按钮布局中
        self.button_layout.addWidget(self.stop_button)  # 添加停止连点按钮到按钮布局中
        self.button_layout.addWidget(self.save_button)  # 添加保存设置按钮到按钮布局中
        self.layout.addLayout(self.button_layout)  # 将按钮布局添加到主布局中

        # 连接按钮的点击事件
        self.left_click_button.clicked.connect(self.start_left_click)  # 左键连点按钮点击事件，调用start_left_click方法
        self.right_click_button.clicked.connect(self.start_right_click)  # 右键连点按钮点击事件，调用start_right_click方法
        self.stop_button.clicked.connect(self.stop_click)  # 停止连点按钮点击事件，调用stop_click方法
        self.save_button.clicked.connect(self.save_settings)  # 保存设置按钮点击事件，调用save_settings方法

        # 添加键盘事件监听
        self.left_click_button.setShortcut(QKeySequence(Qt.Key_Left))  # 设置左键连点按钮快捷键
        self.right_click_button.setShortcut(QKeySequence(Qt.Key_Right))  # 设置右键键点按钮快捷键
        self.stop_button.setShortcut(QKeySequence(Qt.Key_Down))  # 设置停止连点按钮快捷键

        # 定时器
        self.timer = QTimer()  # 创建定时器对象
        self.timer.timeout.connect(self.perform_click)  # 定时器超时事件，调用perform_click方法

        # 连点次数计数器
        self.click_count = 0  # 记录连点次数
        self.left_click = False
        self.right_click = False

        # 添加状态栏并显示版权信息
        self.status_bar = self.statusBar()
        copyright_info = QLabel("Copyright © 2024 Author: Mr. Z E-mail: bob@pheks.com QQ：40061980")
        copyright_info.setStyleSheet("color: #999;")
        copyright_info.setAlignment(Qt.AlignmentFlag.AlignLeft)
        self.status_bar.addWidget(copyright_info)  # 使用 addWidget 而不是 addPermanentWidget

        # 设置全局键盘监听器
        self.listener = keyboard.Listener(on_press=self.on_press)
        self.listener.start()

    def center_on_screen(self):
        """获取屏幕尺寸并居中显示"""
        screen_geometry = QApplication.screenAt(QPoint()).availableGeometry()
        x = (screen_geometry.width() - self.width()) // 2
        y = (screen_geometry.height() - self.height()) // 2
        self.move(x, y)

    @staticmethod
    def open_website(url):
        """打开网页，官方网站和社区支持调用此方法"""
        webbrowser.open(url)  # 打开网页

    @staticmethod
    def check_updates():
        """检查更新"""
        # 创建一个QMessageBox来显示更新信息
        msg = QMessageBox()
        msg.setWindowTitle("检查更新")
        msg.setWindowIcon(QIcon("./static/image/logo.png"))
        msg.setText("当前已是最新版本")
        msg.setIcon(QMessageBox.Icon.Information)
        msg.exec()

    def show_about(self):
        """显示关于窗口"""
        self.about_window = AboutWindow()  # 创建AboutWindow对象
        self.about_window.show()  # 显示窗口

    def save_settings(self):
        """保存设置"""
        try:
            interval = int(self.time_edit.text())

            # 根据用户选择设置连点次数
            if self.count_infinitive_checkbox.isChecked():
                count = -1  # 表示无限制连点
            else:
                count = int(self.count_edit.text())

            self.interval = interval  # 将self.time_edit的值赋给self.time
            self.count = count  # 将根据用户选择设置的连点次数赋给self.count
            print(
                f"当前设置 - 间隔时间: {interval}ms, 点击次数共: {'无限制' if count == -1 else count}")
            return interval, count
        except ValueError:
            print("请输入有效的数字")
            QMessageBox.warning(self, "输入错误", "请输入有效的数字")

    def perform_click(self):
        """执行鼠标点击"""
        if self.left_click:
            pyautogui.click(button='left')
        elif self.right_click:
            pyautogui.click(button='right')

        # 增加点击次数计数器
        self.click_count += 1
        print(f"第{self.click_count}次点击")

        # 如果不是无限连点，检查点击次数是否达到限制
        if self.count != -1:
            if self.click_count >= self.count:
                self.stop_click()

    def start_left_click(self):
        """开始左键连点"""
        self.left_click_button.setChecked(True)  # 左键按钮变为选中状态
        self.right_click_button.setChecked(False)  # 右键按钮变为未选中状态
        self.left_click = True
        self.right_click = False
        self.start_click()  # 调用start_click方法

    def start_right_click(self):
        """开始右键连点"""
        self.right_click_button.setChecked(True)  # 右键按钮变为选中状态
        self.left_click_button.setChecked(False)  # 左键按钮变为未选中状态
        self.left_click = False
        self.right_click = True
        self.start_click()  # 调用start_click方法

    def start_click(self):
        """开始连点"""
        try:
            interval, count = self.save_settings()  # 保存设置并获取间隔时间和连点次数
            if interval > 0:
                self.click_count = 0  # 重置连点次数
                self.timer.start(interval)  # 启动定时器
                print(f"开始连点 - 间隔时间: {interval}ms, 点击次数: {count if count != -1 else '无限制'}")
            else:
                print("请输入有效的间隔时间")
                QMessageBox.warning(self, "输入错误", "请输入有效的间隔时间")
        except ValueError:
            print("请输入有效的数字")
            QMessageBox.warning(self, "输入错误", "请输入有效的数字")

    def stop_click(self):
        """停止连点"""
        self.timer.stop()
        self.click_count = 0
        self.left_click = False
        self.right_click = False
        print("停止连点")

    def on_press(self, key):
        """处理全局键盘按下事件"""
        if key == keyboard.Key.left:  # 按下左键
            self.start_left_click()  # 调用start_left_click方法
        elif key == keyboard.Key.right:  # 按下右键
            self.start_right_click()  # 调用start_right_click方法
        elif key == keyboard.Key.down:  # 按下停止键
            self.stop_click()  # 调用stop_click方法


if __name__ == "__main__":
    app = QApplication(sys.argv)  # 创建QApplication对象
    window = MainWindow()  # 创建MainWindow对象
    window.show()  # 显示窗口
    sys.exit(app.exec())  # 运行程序，并等待退出
